home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library / Microsoft Programmer's Library (CD-ROM Database)(125-099-008)(Version 1.1a)(CDRM 162100)(1989).iso / SAMPCODE / OS2SDK11 / TK4 / OPENDLG / TOOLA.ASM < prev   
Assembly Source File  |  1989-02-20  |  7KB  |  278 lines

  1. ;/*
  2. ; *   File Dialog Library
  3. ; *   Created by Microsoft Corporation, 1989
  4. ; */
  5. .xlist
  6. include cmacros.inc
  7. .list
  8.  
  9. errnz   ?PLM-1          ; this module must use Pascal convention
  10.  
  11. TRUE   = 1
  12.  
  13. externFP        <WinCreateHeap, WinDestroyHeap>
  14.  
  15. sBegin DATA
  16. externW vhModule
  17. externD vhheap
  18. globalW __acrtused,0
  19. sEnd    DATA
  20.  
  21. sBegin CODE
  22.  
  23. assumes cs,CODE
  24. assumes ds,NOTHING
  25.  
  26. ; The following trick is to avoid any need for a DS where a constant
  27. ;   string is needed, any (PSZ)"foo" is replaced by (PSZ)szfoo with
  28. ;   szfoo created in the Code Selector. As we can't do that with C,
  29. ;   we do it with MASM.
  30. ;
  31.     PUBLIC    szStarStar
  32. szStarStar  LABEL   BYTE
  33.     DB    '*','.','*',0
  34.         PUBLIC  szDot
  35. szDot   LABEL   BYTE
  36.         DB      '.',0
  37.  
  38. ;======================================================
  39. ; LCopyStruct(pbSrc, pbDst, cb)
  40. ;
  41. cProc   LCopyStruct, <PUBLIC, NODATA, FAR>, <ds,si,di>
  42. ParmD lpchSrc
  43. ParmD lpchDst
  44. ParmW cb
  45.  
  46. cBegin
  47.         mov     cx, cb
  48.         jcxz    lcopydone           ; all done if crc   == 0
  49.         lds     si, lpchSrc
  50.         les     di, lpchDst
  51.         cmp     si,di
  52.         jae     lcopyok
  53.         mov     ax,cx
  54.         dec     ax
  55.         add     si,ax
  56.         add     di,ax
  57.         std
  58.         rep     movsb
  59.         cld
  60.         jmp     short lcopydone
  61. lcopyok:
  62.         cld
  63.         rep     movsb
  64. lcopydone:
  65.  
  66. cEnd
  67.  
  68.  
  69. ;======================================================
  70. ; LFillStruct(pbSrc, pbDst, cb)
  71. ;
  72. cProc   LFillStruct, <PUBLIC, NODATA, FAR>, <di>
  73. ParmD lpchDst
  74. ParmW cb
  75. ParmB fillByte
  76.  
  77. cBegin
  78.         mov     cx, cb
  79.         jcxz    lfilldone           ; all done if crc   == 0
  80.         les     di, lpchDst
  81.         cld
  82.         mov     al,fillByte
  83.         rep     stosb
  84. lfilldone:
  85. cEnd
  86. ;======================================================
  87. ;
  88. ; lstrlen: Same as strlen except for taking long ptrs
  89. ;
  90.  
  91. cProc   lstrlen,<PUBLIC, NODATA, FAR>
  92. ;       parmD   pStr
  93. cBegin  nogen
  94.         mov     bx,sp
  95.         push    di
  96.         les     di,ss:[bx+4]
  97.         cld
  98.         xor     ax,ax                   ; get zero in ax
  99.         mov     cx,-1                   ; at most 64 k to move
  100.         repnz   scasb                   ; look for end
  101.         mov     ax,cx
  102.         neg     ax
  103.         dec     ax
  104.         dec     ax
  105.         pop     di
  106.         ret     4
  107. cEnd    nogen
  108.  
  109.  
  110. lstrsetup:
  111.         pop     dx
  112.         mov     bx,sp
  113.  
  114.         push    ds
  115.         push    si
  116.         push    di
  117.  
  118.         lds     si,ss:[bx+4]
  119.         les     di,ss:[bx+8]
  120.         regptr  dssi,ds,si
  121.         regptr  esdi,es,di
  122.         cld
  123.         jmp     dx
  124.  
  125. lstrfinish  proc    far
  126.         pop     di
  127.         pop     si
  128.         pop     ds
  129.         ret     8
  130. lstrfinish  endp
  131.  
  132.  
  133. ;======================================================
  134. ;
  135. ;lstrcpy: strcpy with long pointers
  136. ;
  137. cProc   lstrcpy,<PUBLIC, NODATA, FAR>
  138. ;       parmD   pDst                    ; [bx+8]
  139. ;       parmD   pSrc                    ; [bx+4]
  140.  
  141. cBegin  nogen
  142.         call    lstrsetup
  143. lcp1:   lodsb
  144.         stosb
  145.         or      al,al
  146.         jnz     lcp1
  147.         mov     ax,di                   ; point at last byte copied
  148.         dec     ax
  149.         mov     dx,es                   ; and its segment
  150.         jmp     lstrfinish
  151. cEnd    nogen
  152.  
  153.  
  154. ;======================================================
  155. ;
  156. ;lstrcat: Same as strcat except with long ptrs.
  157. ;
  158. cProc   lstrcat,<PUBLIC, NODATA, FAR>
  159. ;   parmD   pDst
  160. ;   parmD   pSrc
  161.  
  162. cBegin  nogen
  163.         call    lstrsetup
  164.         xor     ax,ax                   ; get zero in ax
  165.         mov     cx,-1                   ; at most 64 k to look
  166.         repnz   scasb                   ; look for end
  167.         dec     di                      ; Point at null byte
  168.         jmp     lcp1                    ; jump to lstrcpy loop
  169. cEnd    nogen
  170.  
  171.         ; convert lower case to upper, must preserve es,di,cx
  172.         public  MyUpper
  173. MyUpper:
  174.         cmp     al,'a'
  175.         jb      myu2
  176.         cmp     al,'z'
  177.         jbe     myu1
  178.         ja      myu2
  179. myu1:   sub     al,'a'-'A'
  180. myu2:   ret
  181.  
  182.         ; convert upper case to lower, must preserve es,di,cx
  183.         public  MyLower
  184. MyLower:
  185.         cmp     al,'A'
  186.         jb      myl2
  187.         cmp     al,'Z'
  188.         jbe     myl1
  189.  
  190.         ja      myl2
  191. myl1:   add     al,'a'-'A'
  192. myl2:   ret
  193.  
  194. ;=========================================
  195. ;
  196. ;lstrcmp:   long ptr lVersion of strcmp
  197. ;
  198. cProc   lstrcmp,<PUBLIC, NODATA, FAR>
  199. ;       parmD   ps1
  200. ;       parmD   ps2
  201. cBegin  nogen
  202.         call    lstrsetup
  203. lcmploop:
  204.         xor     ax,ax                   ; AH needs to be zero inside this loop
  205.         cmp     byte ptr [si],al
  206.         je      lsidone                 ; si is finished check for di finish
  207.         cmp     es:byte ptr [di],al
  208.         je      ldismall                ; di finished before si
  209.         lodsb
  210.         mov     bx,ax
  211.         mov     al,es:[di]
  212.         inc     di
  213.         cmp     ax,bx
  214.         je      lcmploop                ; still equal
  215.         mov     al,0                    ; preverve flags
  216.         jb      lsismall                ; si is less than di
  217. ldismall:
  218.         inc     ax
  219.         jmp     lstrfinish
  220. lsidone:
  221.         cmp     byte ptr es:[di],0
  222.         je      lstrfinish
  223. lsismall:
  224.         dec     ax
  225.         jmp     lstrfinish
  226. cEnd    nogen
  227. sEnd CODE
  228.  
  229.  
  230. createSeg _INIT,INIT,byte,public,CODE
  231.  
  232. sBegin  INIT
  233. externNP    <InitLibrary>
  234. assumes CS,INIT
  235. assumes DS,DATA
  236.  
  237. ;======================================================
  238. ; BOOL FAR PASCAL LibInit ()
  239. ; Initializes the library
  240. ; int dataSelector       /* DS = automatic data selector */
  241. ; int wHeapSize;         /* SI = heap size */
  242. ; int hmod;           /* DI = module handle */
  243. ;     {
  244. ;     vhModule = hmod;
  245. ;     if (!(vhheap = WinCreateHeap(dataSelector, wHeapsize, 0, 0, 0, 0)))
  246. ;         return FALSE;;
  247. ;     return (InitLibrary());
  248. ;     }
  249. ;
  250. ; DS already usSet
  251. ;
  252. cProc   LibInit,<FAR, PUBLIC>
  253. cBegin  nogen
  254.         mov     [vhModule],di           ; Remember module handle
  255.  
  256.         sub     ax,ax
  257.         cCall   WinCreateHeap,<ds, si, ax, ax, ax, ax>
  258.         mov     bx, ax
  259.         or      ax, dx
  260.         jz      loaddone                ; Heap wasn't created
  261.         mov     word ptr vhheap, bx
  262.         mov     word ptr vhheap + 2, dx
  263.  
  264.         cCall   InitLibrary                ; continue initialization
  265.         or      ax,ax
  266.         jnz     loaddone                ; OK, init done
  267.         cCall   WinDestroyHeap,<vhheap> ; Non OK, destroy the heap
  268. ;
  269. ; Return non-zero to indicate successful initialization
  270. ;
  271. loaddone:
  272.         ret
  273. cEnd
  274.  
  275. sEnd    INIT
  276.         END LibInit
  277.